// 路由控制器

// sequelize
let Sequelize=require('sequelize');

// 导入工具模块
let utils=require(__basename+'/utils/utils.js')

// 导入API
let api=require(__basename+'/api/api.js')

// 导入白名单
let whiteList=require(__basename+'/whiteList/whiteList.js');

// 获取操作符
let Op=Sequelize.Op;

// 导入moment 处理时间模块
let moment=require('moment');

class RoutesController{

  // 验证验证码请求路径
  validCode(req,res,next){
    // 获取请求路径
    let url=req.url;
    // console.log(url);
    if(whiteList.codeList.indexOf(url)>-1){
      // 需要验证验证码
      // 获取邮箱
      let email=req.body.email;
      // 获取用户输入的验证码
      let code=req.body.code;
      let time=new Date().getTime()-5*60*1000
      // 获取当前时间(24h)
      let date= moment(time).format('YYYY-MM-DD HH:mm:ss')
      console.log(date);
      
      // 查询数据
      api.findData('Code',{
        email,code,
        createdAt:{
          [Op.gte]:date
        }
      }).then(result=>{
        console.log(result);
        if(result.length===0){
          res.send({message:'验证码错误',code:201})
        }else{
          // 验证通过，往后匹配注册路由
          next()
        }
      }).catch(error=>{
        res.send({message:'注册失败',code:201})
      })
    }else{
      // 传递给下一个中间件或者路由
      next()
    }
  }
  // 注册
  register(req,res){
    console.log(req.body);
    // 加密密码
    let password=utils.encodeString(req.body.password);
    console.log(password);
    // 生成userId
    let userId='_u'+new Date().getTime();

    // 用户数据
    let object={
        userId:userId,
        nickname:req.body.nickname,
        email:req.body.email,
        password:password,
    }
    // 查询用户邮箱数据
    api.findData('User',{
      email:req.body.email
    },['userId']).then(result=>{
      console.log(result);
      if(result.length===0){
        //该邮箱没有被注册，将用户数据写入mysql数据库中
        api.createData('User',object).then(result=>{
          res.send({message:'注册成功',code:200,result:result})
        }).catch(error=>{
          // console.log('error==>',error);
          res.send({message:'注册失败',code:201})
        })
      }else{
        // 邮箱已被注册
        res.send({message:'该邮箱已被注册',code:201})
      }
    }).catch(error=>{
      console.log(error);
      res.send({message:'注册失败',code:201})
    })
  }
  // 获取邮箱验证码
  getCode(req,res){
    // 获取用户输入的邮箱地址
    let email=req.body.email;
    // 生成验证码
    let code=Math.random().toString().substr(2,6);
    // 在数据库中存储数据，以便注册验证
    api.createData('Code',{
      email,code
    }).then(result=>{
      // 发送邮件
      utils.sendEmail(email,code,(err,data)=>{
        if(err){
          res.send({message:'获取邮箱验证码失败',code:201})
        }else{
          console.log(data);
          res.send({message:'验证码已发送到你的邮箱',code:200})
        }
      })
    }).catch(error=>{
      console.log(error);
      res.send({message:'获取邮箱验证码失败',code:201})
    })
  }
  // token登录验证
  validLogin(req,res,next){
    console.log('req,url==>',req.url);
    let url=req.url.split('?')[0]
    if(whiteList.tokenList.indexOf(url)>-1){
      // 获取token
      let token=req.body.token ?req.body.token:req.query.token;
      console.log(token);
      // 需要验证token
      utils.verifyToken(token,(error,decode)=>{
        if(error){
          res.send({message:'请先登录',code:203})
        }else{
          console.log('decode==>',decode);
          req.userId=decode.data;
          next()
        }
      })
    }else{
      // 通过
      next()
    }
  }
  // 登录
  login(req,res){
    // console.log('req.body==>',req.body);
    // 查找邮箱账号是否被注册
    api.findData('User',{
      email:req.body.email
    },['userId','password']).then(result=>{
      console.log(result);
      if(result.length==0){
        // 邮箱不存在
        res.send({message:'没有注册过该邮箱',code:201})
      }else{
        // 邮箱存在
        // 匹配密码
        let password=utils.encodeString(req.body.password);   //密码加密
        if(password==result[0].dataValues.password){
          // 登录成功
          // 生成token
          let token=utils.signToken(result[0].dataValues.userId,'1d');
          res.send({message:'登录成功',code:200,token,result:result})
        }else{
          // 密码错误
          res.send({message:'密码错误',code:202})
        }
      }
    }).catch(error=>{
      console.log(error);
      res.send({message:'登录失败',code:202})
    })
  }
  // 获取用户token信息
  getUserInfo(req,res){
    api.findData('User',{
      userId:req.userId
    },['nickname','url']).then(result=>{
      res.send({message:'查询用户信息成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询用户信息失败',code:201})
    })
  }
  // 添加商品类型
  addType(req,res){
    // 生成类型id
    let typeId='_t'+new Date().getTime();
    api.createData('Type',{
      typeId,
      userId:req.userId,
      typeName:req.body.typeName
    }).then(result=>{
      res.send({message:'添加商品类型成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'商品类型添加失败',code:201})
    })
  }
  // 搜索商品类别
  findTypeData(req,res){
    //  AND `type_name` LIKE '%'
    let sql="SELECT * FROM `type` WHERE `user_id`=:userId";
    if(req.body.typeName){
      sql+=" AND `type_name` LIKE '%"+req.body.typeName+"%'"
    }
    sql+=" LIMIT :offset,:count"
    console.log("sql==>",sql);
    api.query(sql,{
      userId:req.userId,
      offset:Number(req.body.offset),
      count:Number(req.body.count)
    }).then(result=>{
      res.send({message:'查询商品类型数据成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询商品类型数据失败',code:201})
    })
  }
  // 修改商品类型
  editType(req,res){
    api.updateData('Type',{typeName:req.body.typeName},{
      typeId:req.body.typeId
    }).then(result=>{
      res.send({message:'修改商品类型成功',code:200,result})
    }).catch(error=>{
      console.log('error==>',error);
      res.send({message:'修改商品类型失败',code:201})
    })
  }
  // 禁用商品类型
  disableType(req,res){
    api.updateData('Type',{status:0},{
      typeId:req.body.typeId,
      userId:req.userId
    }).then(result=>{
      res.send({message:'禁用商品类型成功',code:200,result})
    }).catch(error=>{
      res.send({message:'禁用商品类型失败',code:201})
    })
  }
  // 启用商品类型
  enableType(req,res){
    api.updateData('Type',{status:1},{
      typeId:req.body.typeId,
      userId:req.userId
    }).then(result=>{
      res.send({message:'启用商品类型成功',code:200,result})
    }).catch(error=>{
      res.send({message:'启用商品类型失败',code:201})
    })
  }
  // 删除商品类型
  removeType(req,res){
    api.removeData('Type',{
      userId:req.userId,
      typeId:req.body.typeId
    }).then(result=>{
      res.send({message:'删除商品类型成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'删除商品失败',code:201})
    })
  }
  // 查询商品类型的总数量
  count(req,res){
    api.count('Type',{
      userId:req.userId
    }).then(result=>{
      res.send({message:'查询商品类型总数量成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询商品类型总数量失败',code:201})
    })
  }
  // 查询所有商品类型
  getTypeAll(req,res){
    api.findData('Type',{
      userId:req.userId
    }).then(result=>{
      res.send({message:'查询所有商品类型成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询所有商品类型成功',code:201})
    })
  }
  // 发布商品，添加商品
  addProduct(req,res){
    // 移除多余属性(因为已经通过验证)
    delete req.body.token;
    req.body.pimg=config.serverOptions.host+':'+config.serverOptions.port+'/'+req.body.pimg
    // 字符串转数值
    console.log(req.body.pimg);
    req.body.Price=Number(req.body.Price);  //价格
    req.body.count=Number(req.body.count);  //库存
    req.body.status=Number(req.body.status); //状态
    // 生成商品pid属性
    req.body.pid='_p'+new Date().getTime()
    // userId
    req.body.userId=req.userId
    console.log(req.body);
    // 将商品数据写入表中
    api.createData('Product',req.body).then(result=>{
      res.send({message:'发布商品成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'发布商品失败',code:201})
    })
  }
  // 搜索商品
  searchProduct(req,res){
    let userId=req.userId
    let status=Number(req.body.status)
    let offset=Number(req.body.offset)
    let count=Number(req.body.count)
    let start=req.body.updated_at+' 00:00:00'
    let end=req.body.updated_at+' 23:59:59'
    let sql="SELECT `p`.`pimg`,`p`.`pname`,`p`.`pid`,`p`.`created_At`,`p`.`status`,`p`.`updated_at` AS `updatedAt`,`t`.`type_name` AS `typeName` FROM `product` AS `p` INNER JOIN `type` AS `t` ON `p`.`user_id`=:userId AND `p`.`type_name`=`t`.`type_name`"
    // AND `p`.`pname` LIKE '%i%' AND `p`.`type_name`='手机' AND `p`.`status`=1 AND `p`.`updated_at`>='2021-08-04 00:00:00' AND `p`.`updated_at`<='2021-08-04 23:59:59' ORDER BY `p`.`updated_at` DESC LIMIT 0,7;
    // 如果按照商品名称查找
    if(req.body.pname!=''){
      sql+=" AND `p`.`pname` LIKE '%"+req.body.pname+"%'";
    }
    // 如果按照指定类型查找
    if(req.body.typeName!=''){
      sql+=" AND `p`.`type_name`='"+req.body.typeName+"'"
    }
    // 如果按照商品状态查找
    if(req.body.status){
      sql+=" AND `p`.`status`="+status
    }
    // 如果按照上架时间查找
    if(req.body.updated_at!=''){
      // sql+=" AND `p`.`updated_at`>='2021-08-04 00:00:00' AND `p`.`updated_at`<='2021-08-04 23:59:59'"
      sql+=" AND `p`.`updated_at` >= :start AND `p`.`updated_at` <= :end"
    }
    // 递减查询
    sql+=" ORDER BY `p`.`created_at` DESC LIMIT "+offset+","+count

    api.query(sql,{
      userId,
      offset:req.body.offset,
      count:req.body.count,
      start:req.body.updated_at+' 00:00:00',
      end:req.body.updated_at+' 23:59:59',
    }).then(result=>{
      res.send({message:'查询成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询失败',code:201})
    })
  }
  // 上下架商品
  proStatus(req,res){
    console.log(req.body);
    api.updateData('Product',{
      status:req.body.status==1?'0':'1'
    },{
      pid:req.body.pid
    }).then(result=>{
      res.send({message:"商品状态修改成功",code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:"商品状态修改失败",code:201})
    })
  }
  // 删除商品数据
  removeProuduct(req,res){
    console.log(req.body);
    api.removeData('Product',{
      userId:req.userId,
      pid:req.body.pid,
    }).then(result=>{
      res.send({message:"删除商品成功",code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'删除商品失败',code:201})
    })
  }
  // 查询商品类型总数量
  productCount(req,res){
    api.count('Product',{
      userId:req.userId
    }).then(result=>{
      res.send({message:'查询商品总数量成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询商品总数量失败',code:201})
    })
  }
  // 查看商品
  productById(req,res){
    api.findData('Product',{
      pid:req.body.pid
    }).then(result=>{
      res.send({message:'查询商品成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询商品失败',code:201})
    })
  }
  // 获取用户头像
  getUserImage(req,res){
    api.findData('User',{
      userId:req.userId
    }).then(result=>{
      res.send({message:'查询用户信息成功',code:200,result})
    }).catch(error=>{
      console.log(error);
      res.send({message:'查询用户信息失败',code:201})
    })
  }
  // 获取商品图片
  proudctImageUrl(req,res){
    api.findData('Product',{
      pid:req.body.pid,
      userId:req.userId
    }).then(result=>{
      res.send({message:'查询商品信息成功',code:200,result})
    }).catch(error=>{
      res.send({message:'查询商品信息失败',code:201})
    })
  }
  // 上传头像
  uploadUserImage(req,res){
    // 获取用户图片     前端传递
    let base64=req.body.url.replace(/data:image\/[a-z]+;base64,/,'').replace(/ /g,"+")
    // 图片类型
    let type=req.body.url.split(';')[0].split('/')[1]
    console.log(base64,type);
    // 上传图片
    utils.uploadImg({
      base64,type
    }).then(result=>{
      console.log(result);
      // 生成图片路径
      var url=config.serverOptions.host+':'+config.serverOptions.port+'/'+result.filename
      // 将数据写入数据库
      api.updateData('User',{url},{
        userId:req.userId
      }).then(result=>{
        res.send({message:'上传用户头像成功',code:200,result,url});
      }).catch(error=>{
        console.log(error);
        res.send({message:'上传用户头像失败',code:201});
      })
    }).catch(error=>{
      console.log(error);
      res.send({message:'上传用户头像失败',code:201});
    })
  }
  // 上传商品图片
  uploadProuductImage(req,res){
    // 获取用户图片     前端传递
    let base64=req.body.url.replace(/data:image\/[a-z]+;base64,/,'').replace(/ /g,"+");
    // 图片类型
    let type=req.body.url.split(';')[0].split('/')[1]
    console.log(base64,type);
    // 上传图片
    utils.uploadImg({
      base64,type
    }).then(result=>{
      console.log(result);
      // 生成图片路径
      var url=config.serverOptions.host+':'+config.serverOptions.port+'/'+result.filename
      // 将数据写入数据库
      api.updateData('Product',{pimg:url},{
        userId:req.userId,
        pid:req.body.pid
      }).then(result=>{
        res.send({message:'上传商品图片成功',code:200,result,url});
      }).catch(error=>{
        console.log(error);
        res.send({message:'上传商品图片失败',code:201});
      })
    }).catch(error=>{
      console.log(error);
      res.send({message:'上传商品图片失败',code:201});
    })
  }
};

// 导出实例
module.exports=new RoutesController();